
public class Test {

    public static long factorial(int N) {
        return N < 2 ? N : factorial(N - 1) * N;
        //空间复杂度为：O(N)

        //递归代码的时间复杂度 = 递归的次数 * 每次递归执行的次数

        //我们每次递归呢所执行的代码都是判断 N < 2 这个代码，
        //所以我们可以把每次递归执行的次数看为 1 ，我们递归的次数是N所以我们最终的递归的时间复杂度为：O(N)
    }

    public static int binarySearch(int[] array,int k) {
        int begin = 0;
        int end = array.length - 1;
        while(begin <= end) {
            int mid = begin + ((end - begin) / 2);
            if (array[mid] > k) {
                end = mid - 1;
            }else if (array[mid] < k) {
                begin = mid + 1;
            }else {
                return mid;
            }
        }
        return  -1;
        //二分查找，每次都会去折半，假设我们折半了 x 次 即是 n/2 ^ x = 1
        //我们可以得出 O(logN)
    }
    public static void Swap(int[] array,int a,int b) {
        int temp = array[a];
        array[a] = array[b];
        array[b] = temp;
    }
    public static void func5(int[] array) {
        for (int end = array.length; end > 0; end--) {
            //假设长度为N ，这里执行 n - 1
            boolean sort = true;
            for (int i = 0; i < end; i++) {
                //这里每一次都会进行遍历 n-1 n-2 n-3.......1
                if (array[i - 1] > array[i]) {
                    Swap(array,i-1,i);
                    sort = false;
                }
            }
            if (sort == true) {
                break;
            }
        }
        //空间复杂度：O(1)
        //时间复杂度 F(N) = (n-1 + 1)*(n-1)/2
        //最后得-> O(n^2)
    }
    public static void func4(int N) {
        int count = 0;

        for (int i = 0; i < 100; i++) {
            count++;
        }
        //时间复杂度 F(N) = 100
        //最后得-> O(1)
    }
    public static void func3(int N,int M) {
        int count = 0;
        for (int i = 0; i < N; i++) {
            count++;
        }
        for (int i = 0; i < M; i++) {
            count++;
        }
        //时间复杂度 F(N) = M + N
        //最后得-> O(M + N)
    }
    public static void func2(int N) {
        int count = 0;
        for (int i = 0; i < 2 * N; i++) {
            count++;
        }

        int M = 10;
        while ((M--) > 0) {
            count++;
        }
        //时间复杂度 F(N) = 2*N + 10
        //最后得-> O(N)
    }
    public static void func() {
        //计算func的执行次数
        //时间复杂度的 大O的渐进表示法
        int N = 10000;
        int count = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                count++;
            }
        }
        //执行 N^2
        for (int i = 0; i < 2 * N; i++) {
            count++;
        }
        //执行 2*N
        int M = 10;
        while((M--) > 0) {
            count++;
        }
        //执行 10

        //执行次数 F(N) = N^2 + 2*N + 10 次数
    }
    public static void main(String[] args) {
        func();
    }
}
